-"Version_2_7_2pre31"
+"Version_2_7_2pre32"
if (!fcntl(pool,F_SETLK,&f))
massert(!unlink(gcl_pool) || errno==ENOENT);
register_pool(-1);
- massert(!munmap(Pool,sizeof(struct pool)));
massert(!close(pool));
pool=-1;
+ massert(!munmap(Pool,sizeof(struct pool)));
memset(gcl_pool,0,sizeof(gcl_pool));
no_recur=0;
}
(coerce-to-package (eval (read))))))
;(declaim (inline coerce-to-package))
-(defun reset-lib-syms nil
+(defun reset-lib-syms (on)
(when (find-package "LIB")
(do-external-symbols
(p "LIB")
- (setf (symbol-value p) (dlopen (lib-name p)))
+ (setf (symbol-value p) (when on (dlopen (lib-name p))))
(do-external-symbols
(s p)
- (setf (symbol-value s) (dlsym (symbol-value p) s)))))
+ (setf (symbol-value s) (when on (dlsym (symbol-value p) s))))))
(cfdl))
(defun top-level1 ()
(defun set-up-top-level (&aux (i (argc)) tem)
(declare (fixnum i))
- (reset-lib-syms)
+ (reset-lib-syms t)
(setq *tmp-dir* (get-temp-dir) *current-directory* (current-directory-namestring))
(when *cc* ;raw-image init complete
(setq *current-directory* (pathname *current-directory*)
/* #endif */
bool writable_malloc=0;
+static void *malloc_pre_main_base,*malloc_pre_main_ptr,*malloc_pre_main_end;
static void *
malloc_internal(size_t size) {
if (!msbrk_initialized()) {
static bool recursive_malloc;
- if (recursive_malloc)
- error("Bad malloc");
+ unsigned long s=PAGESIZE;
+
+ massert(!recursive_malloc);
recursive_malloc=1;
- gcl_init_alloc(&size);
+ if (!malloc_pre_main_base) {
+ massert((malloc_pre_main_base=mmap(NULL,s,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0))!=(void *)-1);
+ malloc_pre_main_ptr=malloc_pre_main_base;
+ malloc_pre_main_end=malloc_pre_main_base+s;
+ }
+ massert(size<=(malloc_pre_main_end-malloc_pre_main_ptr));
+ malloc_pre_main_ptr+=size;
recursive_malloc=0;
- }
+ return malloc_pre_main_ptr-size;
+ } else
+ malloc_pre_main_base=malloc_pre_main_ptr=malloc_pre_main_end=NULL;
CHECK_INTERRUPT;
object *p,pp;
- if (ptr == 0)
+ if (ptr == 0 || ptr < data_start || ptr >= core_end)
return;
for (p = &malloc_list,pp=*p; pp && !endp(pp); p = &((pp)->c.c_cdr),pp=pp->c.c_cdr)
}
+DEF_ORDINARY("RESET-LIB-SYMS",sSreset_lib_syms,SI,"");
+
DEFUN("CFDL",object,fScfdl,SI,0,0,NONE,OO,OO,OO,OO,(void),"") {
struct typemanager *tm=tm_of(t_cfdata);
disable_aslr(int argc, char **argv, char **envp) {
long pers;
- long flag = ADDR_NO_RANDOMIZE|(sizeof(flag)==4 ? ADDR_LIMIT_3GB : 0);
+ long flag = ADDR_NO_RANDOMIZE|(sizeof(flag)==4 ? ADDR_COMPAT_LAYOUT : 0);
massert((pers=personality(-1))!=-1);
if (tm->tm_type==v->type)
for (x=pagetochar(page(v)),j=tm->tm_nppage;j--;x+=tm->tm_size) {
object o=x;
- if (type_of(o)==t_stream && !is_free(o) && o->sm.sm_fp && o->sm.sm_fp!=stdin && o->sm.sm_fp!=stdout && o->sm.sm_fp!=stderr)
- close_stream(o);
+ if (type_of(o)==t_stream && !is_free(o) && o->sm.sm_fp) {
+ if (o->sm.sm_fp!=stdin && o->sm.sm_fp!=stdout && o->sm.sm_fp!=stderr)
+ close_stream(o);
+ o->sm.sm_fp=NULL;
+ }
}
gc_time = -1;
tx=type_of(x);
vs_base[0] = alloc_object(t_random);
init_gmp_rnd_state(&vs_base[0]->rnd.rnd_state);
+#if __GNU_MP_VERSION > 4 || (__GNU_MP_VERSION == 4 && __GNU_MP_VERSION_MINOR >= 2)
+ vs_base[0]->rnd.rnd_state._mp_algdata._mp_lc=&Mersenne_Twister_Generator_Noseed;
+#endif
if (tx!=t_fixnum || fix(x)) {
if (tx==t_fixnum) {
if (vs_base[0]->rnd.rnd_state._mp_seed->_mp_size!=1)
extern char *kcl_self;
extern void *shared_lib_start;
extern jmp_buf gmp_jmp;
+ extern object sSreset_lib_syms;
check_arg(1);
memset(FN1,0,sizeof(FN1));
coerce_to_filename(vs_base[0], FN1);
+ ifuncall1(sSreset_lib_syms,Cnil);
close_dlopen_list();
frs_top=frs_org-1;
gcl_cleanup(1);